package com.tedu.day02.oop;

/**
 * 抽象类的特点<补充>
 *       类：成员变量/成员方法/构造方法
 *       抽象类：成员变量/成员方法/构造方法
 *
 *       成员变量：既可以变量，也可以常量
 *       构造方法：有，用于子类访问调用抽象父类的成员变量---赋值
 *       构造方法：既可以抽象，非抽象
 *       抽象方法：与非抽象方法出现在抽象类问题：
 *       A：抽象方法  【重写】强制要求子类完成父类抽象方法
 *       B:非抽象方法  【拓展】子类基层的事情  提高代码复用性
 */
abstract class Foo{
    //成员变量
   public static int i=7;
   public final int J=20;  //成员变量：常量
    //强类型语言：大小写分明
   // public int j=70;

    //构造方法:无参
    public Foo() {
        this(30);  //调用当前类对象的其他构造器
    }
    //有参构造器
    public Foo(int i){
        this.i=i;
    }

    //成员方法:抽象方法
  public   abstract void touch();
    public void ask(){
        System.out.println("Foo  ask");
    }
}
//实现子类
class Goo extends Foo{

    public void touch() {
        System.out.println("Goo   touch");
    }
    public void ask(){
        System.out.println("Goo  ask");
    }
}
public class 抽象类补充知识点 {

        //抽象类----继承----多态性----向上造型
        public static void main (String[]args){
        Foo f = new Goo();
        //①实例化----子类的构造器，默认存在无参构造器
            //再通过super 调用父类无参构造器
            //②执行抽象类无参构造器，发现有this参数调用本类其他有参数构造器
            //③this调用的同时，完成堆抽象类种中 i 进行赋值 i=30
        System.out.println(f.i); //④输出：i的值  30
            //f.J=40;不可修改
            System.out.println(f.J);

            //--------------
            f.touch();   //输出：Goo   touch   重写
            f.ask();     //输出：Goo   ask     拓展【子类方法重写】
    }

}
/*拓展：abstract  关键字共存问题*/
abstract class App{
   // private abstract void show(); 冲突
   // public abstract final void  show2();冲突
   // public static abstract void show3(); 无意义   静态方法需要加语法快{}
}